'use strict';

const Controller = require('egg').Controller;
/**
 * @controller adminLiveController 直播间-后台管理
 */
class LiveController extends Controller {
      /**  
     * @summary 渲染直播间列表
     * @description 渲染直播间列表
     * @router get /admin/live 
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async index() {
        const { ctx, app } = this;
        let tabs = [{
            name:"全部",
            url:"/admin/live",
            active:false
        },{
            name:"直播中",
            url:"/admin/live?status=1",
            status:1,
            active:false
        },{
            name:"未开播",
            url:"/admin/live?status=0",
            status:0,
            active:false
        },{
            name:"直播结束",
            url:"/admin/live?status=3",
            status:3,
            active:false
        }];
        let where=(!ctx.query.status&&ctx.query.status!=0)?{}:{status:ctx.query.status}
        let data = await ctx.page('Live',where,{
            include:[{
                model:app.model.User,
                attributes:['id','username']
            }]
        })
        tabs=tabs.map(item=>{
            if((!ctx.query.status&&ctx.query.status!=0&&item.url==='/admin/live')||(item.status==ctx.query.status)){
                item.active=true
            }
            return item
        })
        data = JSON.parse(JSON.stringify(data))
        await ctx.renderTemplate({
            title: "直播间管理",
            tempType: "table",
            data:data,
            table: {
                tabs,
                // 表头
                columns: [
                    {
                    title: '直播间',
                    fixed: 'left',
                    render(item) {
                        return `
                        <h2 class="table-avatar">
                            <a class="avatar mr-2"><img class="rounded" src="${item.cover}"></a>
                            <a>${item.title} <span>创建人：ceshi</span></a> 
                        </h2>
                        `
                    },
                },
                {
                    title: '观看人数',
                    key: 'look_count',
                    fixed: 'center'
                },{
                    title: '金币数',
                    key: 'coin',
                    fixed: 'center'
                },{
                    title: '创建时间',
                    key: 'created_time',
                    fixed: 'center'
                }, {
                    title: "操作",
                    fixed: 'center',
                    render(item) {
                        let close = ''
                        if(item.status === 1){
                            close = `<a @click="modal('/admin/live/close/${item.id}','是否要关闭该直播间？')" class="btn btn-sm bg-warning text-white">关闭直播</a>`
                        }
                        return `
                        <div class="actions btn-group btn-group-sm">
                            <a @click="openInfo('/admin/live/look/${item.id}','观看记录')" class="btn btn-sm bg-primary text-white">观看记录</a>                        
                            <a @click="openInfo('/admin/live/gift/${item.id}','礼物记录')" class="btn btn-sm bg-purple text-white">礼物记录</a>                 
                            <a @click="openInfo('/admin/live/comment/${item.id}','弹幕记录')" class="btn btn-sm bg-success text-white">弹幕记录</a>         
                            ${close}        
                            <a @click="del('/admin/live/delete/${item.id}')" class="btn btn-sm bg-danger text-white">删除</a> 
                        </div>
                        `
                    }
                }
                ],
                
            }
        })
    }

     /**  
     * @summary 查看直播间观看记录
     * @description 查看直播间观看记录
     * @router get /admin/live/look/:id 
     * * @request id string *id 直播间id
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async look(){
        // 解构
        let {ctx,app}=this
        // 参数验证
        ctx.validate({
            id:{
                required:true,
                type:'int',
                desc:'直播间ID'
            }
        })
        let {id}=ctx.params
        // 关联查询数据
        let data=await app.model.LiveUser.findAll({
            where:{
                id
            },
            include:[
                {
                    model:app.model.User,
                    attributes:['id','username','avatar']
                }
            ]
        })

        // 整理数据格式
        // 返回数据
        ctx.apiSuccess({
            ths:[{
                title: '用户名',
                key: 'username',
            },{
                title: '观看时间',
                key: 'created_time',
            }],
            data:data.map(item=>{
                return {
                    id:item.id,
                    username:item.user.username,
                    avatar:item.user.avatar,
                    created_time:item.created_time
                }
            })
        })
    }

    /**  
     * @summary 查看直播间礼物记录
     * @description 查看直播间礼物记录
     * @router get /admin/live/gift/:id 
     * * @request id string *id 直播间id
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async gift(){
        const { ctx, app } = this;
        const id = ctx.params.id

        let res = await app.model.LiveGift.findAll({
            where:{
                live_id:id
            },
            include:[{
                model:app.model.User,
                attributes:['id','username','avatar']
            },{
                model:app.model.Gift,
            }]
        })

        ctx.apiSuccess({
            ths:[{
                title: '礼物名称',
                key: 'gift_name',
            },{
                title: '礼物图标',
                key: 'gift_image',
                type:"image"
            },{
                title: '礼物金币',
                key: 'gift_coin',
            },{
                title: '赠送者',
                key: 'username',
            },{
                title: '赠送时间',
                key: 'created_time',
            }],
            data:res.map(item=>{
                return {
                    created_time:item.created_time,
                    gift_name:item.gift.name,
                    gift_coin:item.gift.coin,
                    gift_image:item.gift.image,
                    username:item.user.username,
                    avatar:item.user.avatar,
                }
            })
        })
    }

     /**  
     * @summary 查看直播间弹幕记录
     * @description 查看直播间弹幕记录
     * @router get /admin/live/comment/:id 
     * * @request id string *id 直播间id
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async comment(){
        // 解构
        const { ctx, app } = this;
        // 参数验证
        ctx.validate({
            id:{
                type:'int',
                required:true,
                desc:'弹幕id'
            }
        })
        // 获取参数
        const {id} = ctx.params

        let res = await app.model.Comment.findAll({
            where:{
                live_id:id
            },
            include:[{
                model:app.model.User,
                attributes:['id','username','avatar']
            }]
        })

        ctx.apiSuccess({
            ths:[{
                title: '内容',
                key: 'content',
            },{
                title: '发送人',
                key: 'username',
            },{
                title: '发送时间',
                key: 'created_time',
            }],
            data:res.map(item=>{
                return {
                    content:item.content,
                    created_time:item.created_time,
                    username:item.user.username,
                    avatar:item.user.avatar,
                }
            })
        })
    }
     /**  
     * @summary 关闭直播
     * @description 关闭直播
     * @router get /admin/live/close/:id 
     * * @request id string *id 直播间id
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async close(){
        // 解构
        let {ctx,app}=this
        // 参数验证
        ctx.validate({
            id:{
                type:'int',
                desc:'直播间ID',
                required:true
            }
        })
        // 获取数据
        let {id}=ctx.params
        // 判断直播是否结束
        let live=await app.model.Live.findOne({
            where:{
                id
            }
        })
        // 返回ok
        if (!live) {
            ctx.toast('该直播间不存在','danger');
        } else if(live.status === 3) {
            ctx.toast('该直播间已结束','danger');
        } else {
            live.status = 3
            await live.save()
            ctx.toast('关闭成功','success')
        }
        ctx.redirect(`/admin/live`);
    }

    /**  
     * @summary 根据ID删除直播
     * @description 根据ID删除直播
     * * @request id string *id xxx/id
     * @router get /admin/live/delete/:id 
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async delete() {
        // 结构
        let {
            ctx,
            app
        } = this
        // 获得参数
        ctx.validate({
            id: {
                type: 'int',
                required: true,
                desc: '用户ID'
            }
        })
        // 删除数据
        let id = ctx.params.id
        // 添加cookie
        await app.model.Live.destroy({
            where: {
                id
            }
        })
        ctx.toast('删除成功', 'success')
        // 重定向页面
        ctx.redirect('/admin/live')
    }


}

module.exports = LiveController;
